WindowKeyDown vs WindowKeyUp
Most programs respond to WindowKeyDown messages, but not WindowKeyUp messages, because that is sufficient to react to all keystrokes.

WindowKeyDown messages are created at a rate of about 20 per second if a key is held down for more than about .5 seconds, followed by a single WindowKeyUp when the key is released.

virtual key codes

8  0x08 KeyBackspace
9  0x09 KeyTab
12 0x0C KeyClear
13 0x0D KeyEnter
16 0x10 KeyShift
17 0x11 KeyControl
18 0x12 KeyAlt
19 0x13 KeyPause
20 0x14 KeyCapLock
27 0x1B KeyEscape
32 0x20 KeySpace
33 0x21 KeyPageUp
34 0x22 KeyPageDown
35 0x23 KeyEnd
36 0x24 KeyHome
37 0x25 KeyLeftArrow
38 0x26 KeyUpArrow
39 0x27 KeyRightArrow
40 0x28 KeyDownArrow
44 0x2C KeyPrintScreen
45 0x2D KeyInsert
46 0x2E KeyDelete
47 0x2F KeyHelp
 
48 0x30 Key0
49 0x31 Key1
50 0x32 Key2
51 0x33 Key3
52 0x34 Key4
53 0x35 Key5
54 0x36 Key6
55 0x37 Key7
56 0x38 Key8
57 0x39 Key9
65 0x41 KeyA
66 0x42 KeyB
67 0x43 KeyC
68 0x44 KeyD
69 0x45 KeyE
70 0x46 KeyF
71 0x47 KeyG
72 0x48 KeyH
73 0x49 KeyI
74 0x4A KeyJ
75 0x4B KeyK
76 0x4C KeyL
77 0x4D KeyM
78 0x4E KeyN
79 0x4F KeyO
80 0x50 KeyP
81 0x51 KeyQ
82 0x52 KeyR
83 0x53 KeyS
84 0x54 KeyT
85 0x55 KeyU
86 0x56 KeyV
87 0x57 KeyW
88 0x58 KeyX
89 0x59 KeyY
90 0x5A KeyZ
96  0x60 KeyPad0
97  0x61 KeyPad1
98  0x62 KeyPad2
99  0x63 KeyPad3
100 0x64 KeyPad4
101 0x65 KeyPad5
102 0x66 KeyPad6
103 0x67 KeyPad7
104 0x68 KeyPad8
105 0x69 KeyPad9
106 0x6A KeyPadMultiply
107 0x6B KeyPadAdd
108 0x6C _
109 0x6D KeyPadSubtract
110 0x6E KeyPadDecimalPoint
111 0x6F KeyPadDivide
112 0x70 KeyF1
113 0x71 KeyF2
114 0x72 KeyF3
115 0x73 KeyF4
116 0x74 KeyF5
117 0x75 KeyF6
118 0x76 KeyF7
119 0x77 KeyF8
120 0x78 KeyF9
121 0x79 KeyF10
122 0x7A KeyF11
123 0x7B KeyF12
124 0x7C KeyF13
125 0x7D KeyF14
126 0x7E KeyF15
127 0x7F KeyF16
144 0x90 KeyNumLock